package Silnik;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Jakub Banaszewski
 */
public class PobieraczKursu extends Thread
{

   private final ReceivingListener sluchacz;
   private final String waluta;
   private final ArrayList<KursWaluty> dane;
   private MyDate startDate;
   private MyDate endDate;

   public PobieraczKursu(ReceivingListener sluchacz, String waluta)
   {
      dane = new ArrayList<>();
      this.sluchacz = sluchacz;
      this.waluta = waluta;
   }

   public void setEndDate(MyDate endDate)
   {
      this.endDate = endDate;
   }

   public void setStartDate(MyDate startDate)
   {
      this.startDate = startDate;
   }

   @Override
   public void run()
   {
      try
      {
         dane.add(new KursWaluty(waluta, startDate));
         dane.add(new KursWaluty(waluta, endDate));
         ArrayList<KursWaluty> zamiennik;
         List<MyDate> dostepneDaty = Kursy.getDaty();
         int pozStart = dostepneDaty.indexOf(startDate);
         int pozEnd = dostepneDaty.indexOf(endDate);
         
         while ((dane.size() < 400) && ((pozEnd - pozStart) / dane.size() > 2))
         {
            zamiennik = new ArrayList<>();
            KursWaluty kw = dane.get(0);
            zamiennik.add(kw);
            KursWaluty kwi;
            for (int i = 1; i < dane.size(); i++)
            {
               kwi = dane.get(i);
               int pS = dostepneDaty.indexOf(kw.getDzien());
               int pE = dostepneDaty.indexOf(kwi.getDzien());
               MyDate newDay = dostepneDaty.get(pS + (pE - pS) / 2); //TODO Nie wskazywać na daty dni "niekursowych"
               zamiennik.add(new KursWaluty(waluta, newDay));
               zamiennik.add(kwi);
               kw = kwi;
            }
            dane.clear();
            dane.addAll(zamiennik);
            sluchacz.pobranoKursy(dane);
            try
            {
               Thread.sleep(500);
            } catch (InterruptedException ex)
            {
               Logger.getLogger(PobieraczKursu.class.getName()).log(Level.SEVERE, null, ex);
            }
         }
         sluchacz.pobranoKursy(dane);
      } catch (Exception ex)
      {
         Logger.getLogger(PobieraczKursu.class.getName()).log(Level.SEVERE, null, ex);
      }
      sluchacz.skoczonoPobieranie(true);
   }
}
